#ifndef SKIPLIST
#define SKIPLIST

#include "element.H"
#include "tab_dynamique.H"
#include "Intervalle.H"


#define TAILLE_MAX 20

struct SCellule
{
    Elem info;
   int niveauList ;
    SCellule *suivants[TAILLE_MAX] ;
};
typedef SCellule SCellule ;

struct SListe
{
    SCellule *teteListe;
};
// Cree et renvoie une nouvelle SCellule
SCellule *creerCellule();
void testamentSCellule (SCellule *cellule);
void testamentSListe (SListe *liste);

// cree une cellule et lui donne une valeur
SCellule *initialiserSCellule (const Elem valeur);
//crée une nouvelle Sliste
SListe *CreationListe ();

void initialiserSCellulePF(SCellule *cellule);
void afficheSListe (SListe *liste);

void afficheSCellule(SCellule *cellule);

SCellule *  rechercheElementSListe( SListe *liste , Elem e);

// recherche element dans un niveau de la skip list
SCellule* rechercheElementSListeNiveau (SCellule *cellule ,SCellule *cellule_suiv, Elem e  , int niveau) ;

//renvoie vrai si la skiplist est vide et faux sinon ;
bool testSlisteVide(SListe &liste);

void insereElement (SListe *liste , Elem e);
void insereSCellule (SListe *liste , SCellule *cellule);
void insereSCelluleNiveau(SCellule *cellule,SCellule *cellule_precedante,SCellule *cellule_suivante , int niv);
//précondition liste preablement initialiser
void supprimeElementSkiplist (SListe *liste , Elem elem);

void supprimeSCellule(SListe *liste , SCellule *celluleASupprimer , int niv);







#endif



